package Collection;

import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
 排序自定义的元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(2,3));
        list.add(new Point(4,5));
        System.out.println(list);

        /*
         comparable 可比较的
         sort方法在进行排序时要求集合元素必须实现Comparable接口 否则编译不通过
         上述做法对我们的代码有侵入性 尽量避免
         侵入性： 当我们使用某个API的方法时 该方法要求我们为其修改其他额外代码
         这个现象就是侵入性 不利于后期维护
         */
        /*
          比较器接口
          该接口要求实现方法： compare
          目的：为参数o1 o2定义比较大小的规则
          返回值要求：
           当返回值》0时 表示o1>o2
           当返回值《0时 表示o1<o2
           当返回值=0时 表示p1 = o2
         */


   //         @Override
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return len1-len2;
//            }
//        };
        /*
         java中23中设计模式之一：回调模式
         我们调用A类的B方法时  传入一个参数C（C中有一个方法D） 而B方法在执行的过程中会
         回调我们传入C类中的D方法  这种现象称为回调模式
         常见的应用场景：
         文件过滤器： File.listFiles(FileFilter filter)
         集合排序： Collections.sort(List list  Comparator c)
         还有潜艇大战中为键盘 鼠标等添加的监听器都是常见的回调模式
         回调模式常用在异步调用中使用  时常用的设计之一
         */
        //没有侵入性的写法，排序调用时使用匿名内部类传入比较器
        // lambda表达式创建
        Collections.sort(list,
                (o1, o2)->
                   o1.getX()*o1.getX()+o1.getY()*o1.getY()
                   -
                   o2.getX()*o2.getX()-o2.getY()*o2.getY()

        );
        System.out.println(list);


    }
}
